package com.exprecards.common.persistence.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.exprecards.common.persistence.DAOFactory;
import com.exprecards.common.persistence.dao.ConsultasDao;
import com.exprecards.common.persistence.dto.ExpTbProducto;
import com.exprecards.common.persistence.dto.ExpTbSucursal;
import com.exprecards.common.persistence.dto.ExpTbUsuario;
import com.exprecards.common.persistence.exceptions.ExpTbProductoDaoException;
import com.exprecards.common.persistence.exceptions.ExpTbSucursalDaoException;

public class ConsultasDaoImpl implements ConsultasDao {

	protected static final Logger logger = Logger
			.getLogger(ConsultasDaoImpl.class);

	private static final String SQL_FINDSUCURSALESBYEMPRESA = "SELECT SU.ID, SU.NOMBRE, SU.CODIGO, SU.EJECUTIVO, SU.CENTRO_COSTO, SU.ESTADO FROM EXP_TB_EMPRESA EM,EXP_TB_SUCURSAL SU, EXP_TB_CENTRO_COSTO CC WHERE EM.ID=CC.EMPRESA AND CC.ID=SU.CENTRO_COSTO AND EM.ESTADO='A' AND SU.ESTADO='A' AND CC.ESTADO='A' AND  EM.ID = ? ";

	private static final String SQL_FINDUSUARIOCLAVE = "SELECT ID, USUARIO, CLAVE, NOMBRES, APELLIDOS, EMAIL, P_TIPO_USUARIO, ESTADO FROM EXP_TB_USUARIO WHERE USUARIO=? AND CLAVE=? AND ESTADO='A'";

	private static final String SQL_PEDIDODETALLE = "SELECT DET.ID, PROD.NOMBRE, PROD.PRECIO_UNITARIO, DET.CANTIDAD, (PROD.PRECIO_UNITARIO*DET.CANTIDAD) AS VALOR_TOTAL,PROD.CANT_DISPONIBLE FROM EXP_TB_PEDIDO P, EXP_TB_PEDIDO_DETALLE DET, EXP_TB_PRODUCTO PROD WHERE P.ID=DET.PEDIDO AND DET.PRODUCTO=PROD.ID AND P.ID=?";

	private static final String SQL_FINDPRODUCTO = "SELECT PROD.ID, PROD.NOMBRE, PROD.CODIGO_INTERNO, PROD.CANT_DISPONIBLE, PROD.PRECIO_UNITARIO, PROD.UNIDAD_MEDIDA, PROD.TAMANO, PROD.NUM_PAGINAS, PROD.TIPO_MATERIAL, PROD.GRAMAJE, PROD.NUM_TINTAS, PROD.NUMERACION, PROD.TRAFICO, PROD.ORIGINAL, PROD.NUM_COPIAS, PROD.ACABADO, PROD.DESCRIPCION, PROD.URL_IMAGEN, PROD.LINEA_PRODUCTO, PROD.ESTADO, PROD.NUEVO, PROD.TIPO_PAPEL, PROD.LIMITE_INVENTARIO, PROD.CATEGORIA FROM EXP_TB_PRODUCTO PROD, EXP_TB_LINEA_PRODUCTO LP, EXP_TB_EMPRESA EM WHERE PROD.ESTADO='A' AND PROD.LINEA_PRODUCTO=LP.ID AND LP.EMPRESA=EM.ID AND EM.ID=? AND UPPER(PROD.NOMBRE) LIKE ?  ";

	
	
	private static final String SQL_ORDENESTRABAJODETALLE = "SELECT  ENC.ID AS NUMERO_ORDEN, PROD.NOMBRE AS PRODUCTO,PROC.DESCRIPCION AS PROCESO,DET.FECHA_ENTREGA AS FECHA_ENTREGA, DET.ESTADO AS ESTADO, AREA.DESCRIPCION AS AREA   FROM EXP_TB_ORDEN_TRABAJO_ENC ENC,EXP_TB_ORDEN_TRABAJO_DET DET, EXP_TB_PROCESO PROC, EXP_TB_PROCESO_POR_PRODUCTO PP,  EXP_TB_PRODUCTO PROD, EXP_TB_AREA AREA WHERE ENC.ID=DET.ORDEN_TRABAJO_ENC AND DET.PROCESO=PROC.ID AND PP.PROCESO=PROC.ID AND PROC.AREA=AREA.ID AND PP.PRODUCTO=PROD.ID AND DET.ESTADO=?  ";

	
	@Override
	public ExpTbUsuario validaUsuarioClave(String usuario, String clave) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ExpTbUsuario result = null;

		try {
			// get the user-specified connection or get a connection from the
			// ResourceManager
			conn = ResourceManager.getConnection();

			Object[] param = new Object[2];
			param[0] = usuario;
			param[1] = clave;

			ExpTbUsuario[] res = DAOFactory.getExpTbUsuarioDao()
					.findByDynamicSelect(SQL_FINDUSUARIOCLAVE, param);

			if (res.length > 0) {
				result = res[0];
			}

		} catch (Exception _e) {
			logger.error("Exception: " + _e.getMessage(), _e);
		} finally {
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return result;
	}

	private List<Map<String, String>> convertQuery(ResultSet rs)
			throws SQLException {

		List<Map<String, String>> filas = new ArrayList<Map<String, String>>();

		int count = rs.getMetaData().getColumnCount();
		filas = new ArrayList<Map<String, String>>();

		while (rs.next()) {

			Map<String, String> columnas = new HashMap<String, String>();
			for (int i = 1; i <= count; i++) {

				// Tambien se puede agregar el Column name (falta cachear
				// nombre)
				columnas.put(rs.getMetaData().getColumnName(i), rs.getString(i));
				// System.out.println("Columna [" + i + "]- Nombre ["+
				// rs.getMetaData().getColumnName(i) +"] - ["
				// + rs.getString(i) + "]");
			}

			filas.add(columnas);
			// System.out.println("---------------------------------------");
		}

		return filas;
	}

	
	private List<Map<String, String>> convertQueryLabel(ResultSet rs)
			throws SQLException {

		List<Map<String, String>> filas = new ArrayList<Map<String, String>>();

		int count = rs.getMetaData().getColumnCount();
		filas = new ArrayList<Map<String, String>>();

		while (rs.next()) {

			Map<String, String> columnas = new HashMap<String, String>();
			for (int i = 1; i <= count; i++) {

				// Tambien se puede agregar el Column name (falta cachear
				// nombre)
				columnas.put(rs.getMetaData().getColumnLabel(i), rs.getString(i));
				// System.out.println("Columna [" + i + "]- Nombre ["+
				// rs.getMetaData().getColumnName(i) +"] - ["
				// + rs.getString(i) + "]");
			}

			filas.add(columnas);
			// System.out.println("---------------------------------------");
		}

		return filas;
	}
	
	@Override
	public List<Map<String, String>> listaPedidos(String codigo, long empresa,
			long sucursal, long cc, Date fechaPedido, Date fechaIni,
			Date fechaFin, String estado) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String sql = null;
		List<Map<String, String>> filas = null;
		Object[] params = new Object[15];
		int i = 1;
		
		boolean soloEmpresa=false;

		try {
			conn = ResourceManager.getConnection();

			// PEDIDOS SOLO A EMPRESA
			if (sucursal == 0 && cc == 0) {
				sql = "SELECT  * FROM (SELECT PE.ID, PE.CODIGO, concat(EM.NOMBRE,' ') AS EMPRESA, concat(SUC.NOMBRE,' ') AS SUCURSAL,concat(CC.NOMBRE,' ') AS CENTRO_COSTO,DATE_FORMAT(PE.FECHA_PEDIDO,'%Y-%m-%d') AS FECHA_PEDIDO,PE.ESTADO,EM.ID AS ID_EMPRESA,CC.ID AS ID_CC,SUC.ID AS ID_SUC FROM EXP_TB_PEDIDO PE,EXP_TB_EMPRESA EM,EXP_TB_CENTRO_COSTO CC,EXP_TB_SUCURSAL SUC  WHERE PE.EMPRESA=EM.ID AND PE.CENTRO_COSTO=CC.ID AND PE.SUCURSAL=SUC.ID UNION SELECT PE.ID, PE.CODIGO, concat(EM.NOMBRE,' ') AS EMPRESA, (' ') AS SUCURSAL,(' ') AS CENTRO_COSTO,DATE_FORMAT(PE.FECHA_PEDIDO,'%d-%m-%Y  %H:%i:%S') AS FECHA_PEDIDO,PE.ESTADO,EM.ID AS ID_EMPRESA,('') AS ID_CC,('') AS ID_SUC FROM EXP_TB_PEDIDO PE,EXP_TB_EMPRESA EM  WHERE PE.EMPRESA=EM.ID AND PE.SUCURSAL IS NULL AND PE.CENTRO_COSTO IS NULL ) AS TB WHERE 1=1  ";
				soloEmpresa=true;
			}

			// PEDIDOS POR SUCURSAL Y CC
			if (sucursal != 0 && cc != 0) {
				sql = "SELECT PE.ID, PE.CODIGO, concat(EM.NOMBRE,' ') AS EMPRESA, concat(SU.NOMBRE,' ') AS SUCURSAL,concat(CC.NOMBRE,' ') AS CENTRO_COSTO,DATE_FORMAT(PE.FECHA_PEDIDO,'%Y-%m-%d') AS FECHA_PEDIDO,PE.ESTADO FROM EXP_TB_PEDIDO PE,EXP_TB_EMPRESA EM,EXP_TB_SUCURSAL SU, EXP_TB_CENTRO_COSTO CC WHERE PE.EMPRESA=EM.ID AND PE.CENTRO_COSTO=CC.ID AND PE.SUCURSAL=SU.ID ";
			}
			// PEDIDOS POR CENTRO DE COSTO
			else {
				// centro de costo
				if (cc != 0) {
					sql = "SELECT PE.ID, PE.CODIGO, concat(EM.NOMBRE,' ') AS EMPRESA, (' ') AS SUCURSAL,concat(CC.NOMBRE,' ') AS CENTRO_COSTO,DATE_FORMAT(PE.FECHA_PEDIDO,'%Y-%m-%d') AS FECHA_PEDIDO,PE.ESTADO FROM EXP_TB_PEDIDO PE,EXP_TB_EMPRESA EM, EXP_TB_CENTRO_COSTO CC WHERE PE.EMPRESA=EM.ID AND PE.CENTRO_COSTO=CC.ID ";
				}
				// sucursal
				else {
					if (sucursal != 0) {
						sql = "SELECT PE.ID, PE.CODIGO, concat(EM.NOMBRE,' ') AS EMPRESA, concat(SU.NOMBRE,' ') AS SUCURSAL,(' ') AS CENTRO_COSTO,DATE_FORMAT(PE.FECHA_PEDIDO,'%Y-%m-%d') AS FECHA_PEDIDO,PE.ESTADO FROM EXP_TB_PEDIDO PE,EXP_TB_EMPRESA EM,EXP_TB_SUCURSAL SU  WHERE PE.EMPRESA=EM.ID AND PE.SUCURSAL=SU.ID ";
					}
				}

			}

			// empresa
			if (empresa != 0) {
				if(soloEmpresa){
					sql += " AND TB.ID_EMPRESA= ? ";
				}
				else{
					sql += " AND EM.ID= ? ";
				}
				
				params[i] = new Long(empresa);
				i++;
			}

			// sucursal
			if (sucursal != 0) {
				if(soloEmpresa){
					sql += " AND TB.ID_SUC= ? ";
				}
				else{
					sql += " AND SU.ID= ? ";
				}
				params[i] = new Long(sucursal);
				i++;
			}

			// centro de costo
			if (cc != 0) {
				if(soloEmpresa){
					sql += " AND TB.ID_CC= ? ";
				}
				else{
					sql += " AND CC.ID= ? ";
				}
				
				params[i] = new Long(cc);
				i++;
			}

			// codigo
			if (codigo != null && codigo != "") {
				if(soloEmpresa){
					sql += " AND UPPER(TB.ID) LIKE ? ";
				}
				else{
					sql += " AND UPPER(PE.ID) LIKE ? ";
				}
				
				codigo = "%" + codigo.toUpperCase() + "%";
				params[i] = codigo;
				i++;
			}

			// estado
			if (estado != null) {
				if(soloEmpresa){
					sql += " AND TB.ESTADO= ? ";
				}
				else{
					sql += " AND PE.ESTADO= ? ";
				}
				params[i] = estado;
				i++;
			}

			if (fechaPedido != null) {
				if(soloEmpresa){
					sql += " AND TB.FECHA_PEDIDO = DATE_FORMAT(?,'%Y-%m-%d') ";
				}
				else{
					sql += " AND DATE_FORMAT(PE.FECHA_PEDIDO,'%Y-%m-%d') = DATE_FORMAT(?,'%Y-%m-%d') ";
				}
				
				params[i] = new java.sql.Date(fechaPedido.getTime());
				i++;
			} else {
				if (fechaIni != null && fechaFin != null) {
					
					if(soloEmpresa){
						sql += " AND DATE_FORMAT(TB.FECHA_PEDIDO,'%Y-%m-%d') BETWEEN DATE_FORMAT(?,'%Y-%m-%d') and DATE_FORMAT(?,'%Y-%m-%d') ";
					}
					else{
						sql += " AND DATE_FORMAT(PE.FECHA_PEDIDO,'%Y-%m-%d') BETWEEN DATE_FORMAT(?,'%Y-%m-%d') and DATE_FORMAT(?,'%Y-%m-%d') ";
					}
					
					params[i] = new java.sql.Date(fechaIni.getTime());
					i++;
					params[i] = new java.sql.Date(fechaFin.getTime());
					i++;
				}
			}

			if(soloEmpresa){
				sql += " ORDER BY TB.ID DESC";
			}
			else{
				sql += " ORDER BY PE.ID DESC";
			}
			

			stmt = conn.prepareStatement(sql);

			for (int j = 1; j < i; j++) {
				stmt.setObject(j, params[j]);
			}

			filas = this.convertQuery(stmt.executeQuery());
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}

		return filas;

	}

	@Override
	public List<Map<String, String>> consultaPedidoDetalle(int pedido) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<Map<String, String>> filas = null;

		try {
			conn = ResourceManager.getConnection();
			stmt = conn.prepareStatement(SQL_PEDIDODETALLE);
			stmt.setObject(1, new Integer(pedido));
			filas = this.convertQuery(stmt.executeQuery());
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}

		return filas;
	}
	
	
	@Override
	public List<Map<String, String>> consultaOrdenTrabajoDetalle(String estado, String area) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<Map<String, String>> filas = null;

		try {
			conn = ResourceManager.getConnection();
			stmt = conn.prepareStatement(SQL_ORDENESTRABAJODETALLE);
			stmt.setObject(1, estado);
			//stmt.setObject(2, area);
			filas = this.convertQueryLabel(stmt.executeQuery());
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}

		return filas;
	}
	
	

	@Override
	public ExpTbSucursal[] findSucursalesByEmpresa(long empresa) {
		Object[] param = new Object[1];
		param[0] = new Long(empresa);
		ExpTbSucursal[] result = null;

		try {
			result = DAOFactory.getExpTbSucursalDao().findByDynamicSelect(
					SQL_FINDSUCURSALESBYEMPRESA, param);
		} catch (ExpTbSucursalDaoException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public ExpTbProducto[] findProductosByNombre(long empresa, String nombre) {
		Object[] param = new Object[2];
		
		nombre = "%"+nombre.toUpperCase()+"%";
		
		param[0] = new Long(empresa);
		param[1] = nombre;
		ExpTbProducto[] result = null;

		try {
			result = DAOFactory.getExpTbProductoDao().findByDynamicSelect(
					SQL_FINDPRODUCTO, param);
		} catch (ExpTbProductoDaoException e) {
			e.printStackTrace();
		}
		return result;
	}

	/*
	 * @Override public int eliminarPeps(int codAuditoria, int dx) { Connection
	 * conn = null; PreparedStatement stmt = null; ResultSet rs = null; String
	 * sql = null; int filas = 0;
	 * 
	 * try { conn = ResourceManager.getConnection(); sql =
	 * "DELETE FROM GAM_TB_PEP_AUDIT WHERE REG_AUDITORIA=? AND DIAGNOSTICO=? ";
	 * stmt = conn.prepareStatement(sql); stmt.setObject( 1, new
	 * Integer(codAuditoria)); stmt.setObject( 2, new Integer(dx));
	 * 
	 * filas = stmt.executeUpdate();
	 * 
	 * } catch (SQLException e) { e.printStackTrace(); } finally {
	 * ResourceManager.close(rs); ResourceManager.close(stmt);
	 * ResourceManager.close(conn); } return filas; }
	 */

	/*
	 * @Override public int aplicarGlosasAFactura(int codFact, int codAudit
	 * ,Date fechaIncial, Date fechaFinal){
	 * 
	 * Connection conn = null; PreparedStatement stmt = null; ResultSet rs =
	 * null; String sql = null; List<Map<String, String>> filas = null; int
	 * sum=0;
	 * 
	 * try { conn = ResourceManager.getConnection(); sql =
	 * "UPDATE GAM_TB_GLOSA_AUDIT SET FACT_AUDIT="+codFact;
	 * sql+=" WHERE REG_AUDITORIA=? AND FECHA_VISITA BETWEEN ? AND ?  "; stmt =
	 * conn.prepareStatement(sql);
	 * 
	 * stmt.setObject( 1, new Integer(codAudit)); stmt.setObject( 2, new
	 * java.sql.Date( fechaIncial.getTime() )); stmt.setObject( 3, new
	 * java.sql.Date( fechaFinal.getTime() ));
	 * 
	 * sum = stmt.executeUpdate();
	 * 
	 * } catch (SQLException e) { e.printStackTrace(); } finally {
	 * ResourceManager.close(rs); ResourceManager.close(stmt);
	 * ResourceManager.close(conn); } return sum; }
	 */

}
